/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.modelo.beans.Contacto;
import com.ipartek.formacion.gestformwww.modelo.beans.FiltroContacto;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.IContactoDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author 
 */
public class SQLServerContactoDAO implements IContactoDAO {

    private static ResourceBundle rb;

    public ArrayList<Contacto> listarContacto(FiltroContacto filtro) throws GestorFormacionExcepcion {

        ArrayList<Contacto> alcontactos = new ArrayList<Contacto>();
        Connection conexion = null;
        Contacto contacto = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        int primerelemento = (filtro.getPagsiguiente() - 1) * filtro.getElementospag() + 1;
        int ultimoelemento = filtro.getPagsiguiente() * filtro.getElementospag();
        String sql = filtro.getSQL();
        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            pstmt = conexion.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                contacto = new Contacto();
                if (rs.getRow() >= primerelemento && rs.getRow() <= ultimoelemento) {
                    contacto = instanciarContacto(rs);
                    alcontactos.add(contacto);
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            closeAll(pstmt, rs, conexion);
        }
        return alcontactos;
    }

    /**
     * Crea una instancia de Contacto con los datos obtenidos de la base de datos.
     * @author  Jorge,Ainara,Enrique
     * @param rs: Recibe un ResultSet con una posición concreta.
     * @return Devuelve una instancia de Contacto con los datos del ResultSet indicado.
     */
    private Contacto instanciarContacto(ResultSet rs) throws GestorFormacionExcepcion {

        Contacto contacto = new Contacto();
        try {

            contacto.setContId(rs.getInt("ContId"));
            contacto.setCanId(rs.getInt("CanId"));
            contacto.setConvId(rs.getInt("ConId"));
            contacto.setFechaCon(rs.getTimestamp("FechaContacto"));
            contacto.setObs(rs.getString("Observaciones"));

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        }
        return contacto;

    }

    /**
     * Metodo que se encarga de cerrar, los elementos necesarias para el acceso a datos
     * @param PreparedStatement pstmt
     * @param ResultSet rs
     * @param Connection conexion
     */
    private void closeAll(Statement pstmt, ResultSet rs, Connection conexion) {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pstmt != null) {
                pstmt.close();
            }
            if (conexion != null) {
                SQLServerDAOFactory.desconecta(conexion);
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerConvocatoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public int contarContacto(FiltroContacto filtro) throws GestorFormacionExcepcion {
        int registros = 0;

        Connection conexion = null;
        String sql = filtro.getSQL();

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet rs = stmt.executeQuery();

            if (rs.last()) {
                registros = rs.getRow();
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return registros;
    }

    public void insertar(Contacto contacto) throws GestorFormacionExcepcion {

        Connection conexion = null;
        String sql = null;
        PreparedStatement ps = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sql = "INSERT INTO CONTACTO (CanId, ConId, FechaContacto, Observaciones) VALUES (?,?,?,?)";

            ps = conexion.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

            ps.setInt(1, contacto.getCanId());
            ps.setInt(2, contacto.getConvId());
            ps.setTimestamp(3, contacto.getFechaCon());
            ps.setString(4, contacto.getObs());

            ps.execute();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerConvocatoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            closeAll(ps, null, conexion);
        }

    }
    /**
     * Metodo para obtener un objeto CandConv de la BBDD a partir del ID de Candidato y COnvocatoria
     * @param idCand ID del Candidato
     * @param IdConv ID de la Convocatoria
     * @return Objeto CandConv
     * @throws GestorFormacionExcepcion
     */
    public int comprobarContactosCand(int idCand, int idConv) throws GestorFormacionExcepcion {
        String sentencia = "";
        Connection con;
        int contacto=0;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sentencia = "SELECT Count(ContId) AS ContId FROM Contacto WHERE CanId= ? AND ConId= ? ";

            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, idCand);
            stmt.setInt(2, idConv);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
              contacto = rs.getInt("ContId");
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
            return contacto;
        }
    }
    public void eliminar(int contId) throws GestorFormacionExcepcion {
        Connection conexion = null;
        String sql = "DELETE FROM CONTACTO WHERE contId=" + contId;
        PreparedStatement ps = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            ps = conexion.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

            ps.execute();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerConvocatoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            closeAll(ps, null, conexion);
        }

    }

    public void eliminarTodosContactosCandidato(int canId, int conId) throws GestorFormacionExcepcion {
        Connection conexion = null;
        String sql = "DELETE FROM CONTACTO WHERE canId = " + canId + " AND conId = " + conId;
        PreparedStatement ps = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            ps = conexion.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

            ps.execute();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerConvocatoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            closeAll(ps, null, conexion);
        }

    }

    public void modificar(Contacto contacto) throws GestorFormacionExcepcion {

        Connection conexion = null;
        PreparedStatement ps = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {

            ps = conexion.prepareStatement("UPDATE CONTACTO SET  CanId = ? , ConId = ? , FechaContacto= ?, Observaciones=? where ContId= "+contacto.getContId());

            ps.setInt(1, contacto.getCanId());
            ps.setInt(2, contacto.getConvId());
            ps.setTimestamp(3, contacto.getFechaCon());
            ps.setString(4, contacto.getObs());

            ps.executeUpdate();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerConvocatoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            closeAll(ps, null, conexion);
        }
    }

    public Contacto getContacto(int idContacto) throws GestorFormacionExcepcion {
        Contacto contacto = new Contacto();
        String sql = "SELECT ContId, CanId, ConId, FechaContacto, Observaciones FROM CONTACTO WHERE ContId = " + idContacto;
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            stmt = con.createStatement();
            rs = stmt.executeQuery(sql);

            while (rs.next()) {
                contacto.setContId(rs.getInt("ContId"));
                contacto.setCanId(rs.getInt("CanId"));
                contacto.setConvId(rs.getInt("ConId"));
                contacto.setFechaCon(rs.getTimestamp("FechaContacto"));
                contacto.setObs(rs.getString("Observaciones"));
            }

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerContactoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        }


        closeAll(stmt, rs, con);
        return contacto;
    }
}
